package com.bootdo.app.util;

import com.bootdo.app.common.utils.PayUtil;
import com.bootdo.app.common.utils.WXPay;

import java.util.HashMap;
import java.util.Map;

/**
 * @create 2021-03-01 18-10
 */
public class WxPayUtils {

    public static Map createWxPayXml(String appId,String goodsName,String ip,String totalFee,String pro,String openId,String nonce_str) throws Exception {

        String body = goodsName;
        // 获取客户端的ip地址

        int totalFeeP=(int) (Double.parseDouble(totalFee) * 100);
        // 组装参数，用户生成统一下单接口的签名
        Map<String, String> packageParams = new HashMap<String, String>();
        packageParams.put("appid", appId);
        packageParams.put("mch_id", WXPay.WxPayConfig.mch_id);
        packageParams.put("nonce_str", nonce_str);
        packageParams.put("body", body);
        packageParams.put("out_trade_no", pro);// 商户订单号
        packageParams.put("total_fee", totalFeeP+"");// 支付金额，这边需要转成字符串类型，否则后面的签名会失败
        packageParams.put("spbill_create_ip", ip);
        packageParams.put("notify_url", WXPay.WxPayConfig.notify_url);// 支付成功后的回调地址
        packageParams.put("trade_type", WXPay.WxPayConfig.TRADETYPE);// 支付方式
        packageParams.put("openid", openId);
        String prestr = PayUtil.createLinkString(packageParams); // 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        // MD5运算生成签名，这里是第一次签名，用于调用统一下单接口
        String mysign = PayUtil.sign(prestr, WXPay.WxPayConfig.key, "utf-8").toUpperCase();

        // 拼接统一下单接口使用的xml数据，要将上一步生成的签名一起拼接进去
        String xml = "<xml>" + "<appid>" + appId + "</appid>" + "<body><![CDATA[" + body
                + "]]></body>" + "<mch_id>" + WXPay.WxPayConfig.mch_id + "</mch_id>" + "<nonce_str>" + nonce_str
                + "</nonce_str>" + "<notify_url>" + WXPay.WxPayConfig.notify_url + "</notify_url>" + "<openid>"
                + openId + "</openid>" + "<out_trade_no>" + pro + "</out_trade_no>" + "<spbill_create_ip>"
                + ip + "</spbill_create_ip>" + "<total_fee>" + totalFeeP + "</total_fee>"
                + "<trade_type>" + WXPay.WxPayConfig.TRADETYPE + "</trade_type>" + "<sign>" + mysign + "</sign>"
                + "</xml>";

        System.out.println(xml);
        System.out.println("----------");

        // 调用统一下单接口，并接受返回的结果
        String result = PayUtil.httpRequest(WXPay.WxPayConfig.pay_url, "POST", xml);
        // 将解析结果存储在HashMap中
        Map map = PayUtil.doXMLParse(result);

        String return_code = (String) map.get("return_code");// 返回状态码

        Map<String, Object> response = new HashMap<String, Object>();// 返回给小程序端需要的参数
        if (return_code == "SUCCESS" || return_code.equals(return_code)) {
            String prepay_id = (String) map.get("prepay_id");// 返回的预付单信息
            response.put("nonceStr", nonce_str);
            response.put("package", "prepay_id=" + prepay_id);
            Long timeStamp = System.currentTimeMillis() / 1000;
            response.put("timeStamp", timeStamp + "");// 这边要将返回的时间戳转化成字符串，不然小程序端调用wx.requestPayment方法会报签名错误
            // 拼接签名需要的参数
            String stringSignTemp = "appId=" + appId + "&nonceStr=" + nonce_str
                    + "&package=prepay_id=" + prepay_id + "&signType=MD5&timeStamp=" + timeStamp;
            // 再次签名，这个签名用于小程序端调用wx.requesetPayment方法
            String paySign = PayUtil.sign(stringSignTemp, WXPay.WxPayConfig.key, "utf-8").toUpperCase();
            response.put("paySign", paySign);
        }

        response.put("appid", appId);
        return response;
    }
}
